אוניברסיטת בן גוריון בנגב מספר נבחן : תאריך המבחן: כ"ה תשרי תשע"ח 15/10/17 שמות המורים: ציון סיקסיק א' ב- C תכנות מבחן ב: 202-1-9011 מס' הקורס : הנדסה מיועד לתלמידי : א' מועד קיץ סמ' שנה תשע"ז 3 שעות משך הבחינה : דף פוליו אחד לא מודפס חומר עזר : ולא מצולם. אין להשתמש במחשבון. במבחן זה 5 שאלות רשמו תשובותיכם בדפי התשובות בלבד מחברת הטיוטה לא תימסר לבדיקה בסיום המבחן נאסוף רק את דפי התשובות מותר להגדיר פונקציות עזר בכל השאלות, אלא אם נאמר אחרת. כתבו קוד קריא והקפידו על אינדנטציה והערות )בעברית(. ב ה צ ל ח ה! 1
#include <stdio.h> #include <stdlib.h> שאלה )14 1 נקודות( נתונה התכנית הבאה: typedef struct item *link; typedef struct item { int value; link next; item; void what(link head, int num, int bip) { if (!head) return; switch (bip) { case 0: if (head->value >= num) { printf("%d\n", head->value); what(head->next, num, bip + 1); else what(head->next, num, bip); break; case 1: what(head->next, num, bip + 1); break; case 2: printf("%d\n", head->value); what(head->next, num, bip - 1); void main() { link top = NULL, temp; int i, arr[] = { 2, 10, 8, 4, 2, 1, 13, 6, 4, 5 ; for (i = 0; i < 10; i++) { temp = (link)malloc(sizeof(item)); temp->value = arr[i]; temp->next = top; top = temp; what(top, 7, 0); סעיף א'. )8 נקודות( מה הפלט של התכנית הנ"ל? סעיף ב'. )6 נקודות( הסברו במשפט אחד מה יעודה של הפונקציה?what 2
יותר משני בנים, משתמשים בהגדרה הבאה: typedef struct newnode{ int val, sonsnumber; struct newnode **arr, *father; newnode; שאלה )18 2 נקודות( כדי להגדיר עץ כללי, בו לכל צומת עשויים להיות כאשר sonsnumber הוא מספר הבנים של הצומת ו- arr מערך של מצביעים לבנים, father הוא מצביע לאב של הצומת. ניתן ליצג את הנתונים של עץ כללי בעזרת עץ בינארי ומשתמשים בהגדרה הבאה: typedef struct Node{ int val; struct Node* firstson, *nextbrother; Node; בעץ הבינארי הזה כל צומת מפנה ל- firstson הבן הראשון )השמאלי( של צומת זה שלמעשה מוגדר בעץ הכללי כ-[ arr[0 ולאח הבא )מימין( של צומת זה מהעץ הכללי )nextbrother( או NULL אם אין כזה. בהינתן מבנה נתונים כזה, הפונקציה root) newnode* transformtree(node* שמקבלת root שורש עץ בינארי יוצרת ומחזירה עץ כללי חדש שמיצג את אותום נתונים. השלימו בדף התשובות את הקטעים המסומנים ב-?? n??. מניחים שהעץ תקין ושכל פונקציות הספריה מתפקדות ללא תקלה. ( רק עבור שורש העץ החדש הפונקציה אינה מעדכנת את השדה ) father #include <stdlib.h> newnode* transformtree(node* root) { newnode* newroot; Node* temp; int i; if (root == NULL) return NULL; newroot =?? 1?? ; newroot->val =?? 2?? ; for (i=0, temp =?? 3?? ; temp; temp=temp->nextbrother, i++);?? 4?? = i; if (i == 0)?? 5?? ; else { newroot->arr =?? 6?? ; for (i=0,?? 7?? ; temp; temp=temp->nextbrother, i++) { newroot->arr[i] =?? 8?? ;?? 9?? = newroot; return newroot; 3
שאלה ( 3 23 נקודות ) כיתבו פונקציה newsizeptr) char **palindrome(char **strarr, int size, int* המקבלת מערך של מחרוזות,strArr את גודלו size ומצביע למספר שלם.newSizePtr הפונקציה תחזיר מערך חדש של מחרוזות חדשות. המערך החדש יכיל אך ורק את המחרוזות מ- strarr המהוות פולינדרום, ודרך המצביע newsizeptr הפונקציה "תחזיר" את גודל המערך החדש. שימו לב: לא ניתן להניח דבר על המערך שהתקבל בפונקציה. אין לשנות את המערך שהתקבל בפונקציה. חובה לכתוב לפחות פונקצית עזר אחת. ניתן להניח כי כל פונקציות הספרייה עובדות היטב. כל המערכים שנוצרו בפונקציה חייבים להיות בגודל מדויק ללא איברים מיותרים. שאלה )23 4 נקודות( נתונה מטריצה של מספרים שלמים MxN עם ערכים 0 ו- 1 בלבד. סעיף א'. )20 נקודות( כתבו פונקציה..) N, SquareSize (int ** board, int M, int לא רקורסיבית ויעילה ביותר אשר מוצאת גודל הריבוע המקסימלי במטריצה הנתונה שכולו 1 םי-. לדוגמא, עבור המטריצה הבאה התשובה אמורה להיות 4. 0 0 0 0 0 0 0 0 0 0 0 0 1 1 1 1 1 0 0 0 0 1 1 1 1 1 1 0 0 0 0 0 0 1 1 1 1 0 0 0 0 1 1 1 1 1 1 0 0 1 0 0 1 1 1 1 0 0 0 1 0 1 1 1 0 0 1 0 0 1 0 0 0 0 0 0 0 0 0 0 דרך הערך המוחזר של הפונקציה ו/או ארגומנטים נוספים הפונקציה מחזירה גודל הריבוע המקסימלי, וקואורדינטות הפינה העליונה שמאל של הריבוע. סעיף ב'. )3 נקודות( int **arr, N, M, max, x, y ; עבור ההכרזה: רשמו קריאה לפונקציה שמאפשרת לקבל ב- y max,,x את הערכים הנדרשים. שימו לב: חובה לכתוב שתי פונקציות עזר. 4
שאלה ( 5 25 נקודות( בכל מחלקה שבה סטודנטים לומדים את הקורס שלנו קיים קובץ נתוני הסטודנטים האלה, כל שורה בקובץ מכילה את הפרטים הבאים: 20 תווים - שם הסטודנט 20 תווים - כתובת 9 ספרות - מספר ת.ז. 2 ספרות )בין 11 ל- 99 ( - מספר תרגול הקובץ מסודר לפי מספר ת.ז. בסדר עולה. שם הקובץ הוא קוד המחלקה )2 ספרות( עם סיומת.txt כתוב פונקציה ) new_files( int שיוצרת מספר קבצים חדשים כמספר התרגולים בפועל בקורס. המספר הזה אינו ידוע מראש )כי משתנה במהלך הרישום(. שם כל קובץ הוא tirgul_nn.dat כאשר NN הוא קוד התרגול. כל שורה בקובץ מכילה: 20 תווים - שם הסטודנט 9 ספרות - מספר ת.ז. 2 ספרות - קוד מחלקה 2 ספרות )נתון זה קיים רק אם הסטודנטים לומד בשתי מחלקות ) קוד מחלקה שניה - הקבצים מסודרים לפי מספר ת.ז. בסדר עולה. לדוגמא אם בקורס נפתחו שלוש קבוצות תרגול 11 14, 17, הפונקציה יוצרת בדיוק שלושה קבצים שהם:. tirgul_11.dat,tirgul_14.dat,tirgul_17.dat הפונקציה תחזיר את מספר הקבצים שנוצרו ובכל מקרה של תקלה בעבודה עם קובץ הפונקציה תחזיר את הערך 0. שימו לב! סטודנט יכול ללמוד לכל היותר בשתי מחלקות מניחים שאין טעות ברישום ושאין מצב שאותו סטודנט רשום בקבוצות שונות בכל אחד מהקבצים, אין תווי הפרדה בין נתון לנתון. אין לעבור על קובץ יותר מפעם אחת. אין להעתיק קובץ למבנה נתונים אחר )מערך, רשימה משורשרת, עץ,קובץ אחר...(. 5
רשימת פונקציות קלט/פלט: INPUT/OUTPUT FUNCTIONS PROTOTYPES Open/Close a file FILE *fopen( char *filename, char *mode ); int fclose(file *stream); Repositions the file pointer to the beginning of a file void rewind( FILE *stream ); Get/put a character int fgetc( FILE *stream ); int fputc( int c, FILE *stream ); Get/put a string char *fgets( char *string, int n, FILE *stream ); int fputs( const char *string, FILE *stream ); Formatted Input/Output int fscanf( FILE *stream, const char *format [, argument ]... ); int sscanf( const char *string, const char *format [, argument ]... ); int fprintf( FILE *stream, const char *format [, argument ]...); int sprintf( char *string, const char *format [, argument ]...); Remove a file int remove(const char* filename); Rename a file int rename(const char* oldname, const char*newname); ב ה צ ל ח ה! 6